THESE ARE NOTES ONLY. These changes are being considered and as yet are not part of the current distribution of GrepBrowser. -gmv 9/15/93. Notes 7/22/93, Thursday ======================================= Design notes for GrepBrowser command line processing algorithm for use with Windows' Program Manager. ======================================= It should be possible to invoke GrepBrowser with no args, 1 arg, or 2 args: GrepBrowser [grepFile] [searchFile] This is the most simple syntax. Its deficiencies can be overcome through interaction with menu commands. A more sophisticated syntax with flags and arguments or keywords and arguments (e.g. grepFile: class.grp searchFile: app.h) may be useful as features and options are added. If more than two options can be specified from the command line, the specification should be indepent of the order in which the arguments appear. This makes flags or keywords necessary since the meaning of an argument can not be inferred from its position. The issue of complex command lines should be deferred until menu commands have been implemented to handle all possible ways the GrepBrowser might be invoked. The most obious case is making the GrepBrowser useful when it is invoked with no arguments. To make this possible, extra work must be done with the Menu command interface for GrepBrowser. Unfortunately the goal of flexible interactive operation of GrepBrowser leads to a redesign of the menus and of user commands. For example, what happens if the user invokes GrepBrowser with no arguments. As it now works, the application is essentially dead. You have two empty windows with no way of indicating a new grepFile from which the browser should reinitialize itself. There is some potential confusion when redesigning the menus. Is opening a file to refer to setting a new grepFile and reinitializing the grepList from the file? Or is opening a file to refer to opening a text file for writing notes or editing source code? It seems that in keeping with expectations with the behavior of popular Windows and Mac software, that File / Open should refer to a file. The same applies to New, Save, and Save As, also found in the File menu. The thing to do (this is also a good demonstration of polymorphism) is to put a 'New' or 'New List' command as the first entry in the List. Currently the first entry is 'Open file.' Again there is polymorphism here. (The File menu also has an Open command). This points to a conceptual conflict. Text editors can be opened from either the File menu or the List menu. However, Save, in the File menu, applies to the file selected in the list pane and implicitly associated with the text (file contents) displayed in the text pane. Sometimes the File commands refer to independent text files (New Workspace, Open and sometimes they refer to the selected GrepObject (file) in the list pane (Save, Restore). The File / Save As command is never enabled--another potential confusion. The style of the menus may seem normal to a Smalltalk user, but it is likely to confuse people more familiar with other Windows applications. Smalltalk people take for granted that the commands in the File menu operate on the active text pane-- most of the time. Occassionally commands in the File menu apply to activities with a wider scope than the current window--the development environment in Smalltalk (Open a Workspace, ClassHierarchyBrowser, or DiskBrowser). File New Workpace Open File Save Restore ---------- About Edit (same) List New List Open File ---------- Scroll Line Search File ---------- Info Reinitialize Note in the above design, About is moved from the List menu to the File menu and Save As is removed from the File menu. New List and Search File commands are added to the List menu. Error checking and recovery needs to be added. Grep lists should allow comments. If a line begins with #, it is a comment. Blank lines should be ignored. There should be an option to strip the file:lineNumber: string from the text of the GrepObject. It should be possible to embed relevant browser options at the beginning of the data file. If a line is encountered in which a lineNumber is specified without a file AND no searchFile has been specified, a warning dialog should give the user a chance to specify a search file. This question should only be asked on the first encounter of a lineNumber with no file during the parse of the grepList. The answer to the warning will determine how any other lines with missing files will be handled. If the user indicates 'No' wish to specify a search files, all lines missing file names will be treated like comments and ignored. If the user says 'Yes' and indicates a searchFile, all lines missing file names subsequently encounted will create GrepObjects for the specified searchFile. GrepObjects should be given knowledge of their original specification so that modified grepLists can be reconstructed and written back to disk. In addition to fields already in GrepObjects, GrepObjects should retain: printString string which appears in GrepBrowser list pane specificationString line from which GrepObject was built lineNumber specHasFilename boolean originalLineNumber line number in specification Strictly speaking, the last two fields are not required. This information can always be obtained from the original specification string. At least methods returning this information should be supplied, even if it is necesary to parse the original string again. It's best to think of the later two fields as a cache to enable quick scan and update for a potentially large list of GrepObjets. One field is a boolean and the other is an Integer so even for a list of 1000 items the extra memory required should be under 5K. Measurements should be taken for updating large lists with and without the cache; preserving the data in fields may not even make a noticeable difference.